load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
load(
    "//rust:defs.bzl",
    "capture_clippy_output",
    "clippy_flag",
    "clippy_flags",
    "error_format",
    "extra_exec_rustc_flag",
    "extra_exec_rustc_flags",
    "extra_rustc_flag",
    "extra_rustc_flags",
    "no_std",
    "per_crate_rustc_flag",
    "rustc_output_diagnostics",
)

exports_files([
    "LICENSE",
    "MODULE.bazel",
])

bzl_library(
    name = "bzl_lib",
    srcs = [
        ":version.bzl",
    ],
    visibility = ["//visibility:public"],
)

# This setting may be changed from the command line to generate machine readable errors.
error_format(
    name = "error_format",
    build_setting_default = "human",
    visibility = ["//visibility:public"],
)

# This setting may be changed from the command line to generate rustc diagnostics.
rustc_output_diagnostics(
    name = "rustc_output_diagnostics",
    build_setting_default = False,
    visibility = ["//visibility:public"],
)

# This setting may be used to pass extra options to clippy from the command line.
# It applies across all targets.
clippy_flags(
    name = "clippy_flags",
    build_setting_default = [],
    visibility = ["//visibility:public"],
)

clippy_flag(
    name = "clippy_flag",
    build_setting_default = "",
    visibility = ["//visibility:public"],
)

# This setting may be used to pass extra options to rustc from the command line
# in non-exec configuration.
# It applies across all targets whereas the rustc_flags option on targets applies only
# to that target. This can be useful for passing build-wide options such as LTO.
extra_rustc_flags(
    name = "extra_rustc_flags",
    build_setting_default = [],
    visibility = ["//visibility:public"],
)

extra_rustc_flag(
    name = "extra_rustc_flag",
    build_setting_default = "",
    visibility = ["//visibility:public"],
)

# This setting may be used to pass extra options to rustc from the command line
# in exec configuration.
# It applies across all targets whereas the rustc_flags option on targets applies only
# to that target. This can be useful for passing build-wide options such as LTO.
extra_exec_rustc_flags(
    name = "extra_exec_rustc_flags",
    build_setting_default = [],
    visibility = ["//visibility:public"],
)

extra_exec_rustc_flag(
    name = "extra_exec_rustc_flag",
    build_setting_default = "",
    visibility = ["//visibility:public"],
)

per_crate_rustc_flag(
    name = "experimental_per_crate_rustc_flag",
    build_setting_default = "",
    visibility = ["//visibility:public"],
)

# This setting is used by the clippy rules. See https://bazelbuild.github.io/rules_rust/rust_clippy.html
label_flag(
    name = "clippy.toml",
    build_setting_default = "//tools/clippy:clippy.toml",
    visibility = ["//visibility:public"],
)

# This setting is used by the rustfmt rules. See https://bazelbuild.github.io/rules_rust/rust_fmt.html
label_flag(
    name = "rustfmt.toml",
    build_setting_default = "//tools/rustfmt:rustfmt.toml",
    visibility = ["//visibility:public"],
)

alias(
    name = "rustfmt",
    actual = "//tools/rustfmt:target_aware_rustfmt",
    visibility = ["//visibility:public"],
)

capture_clippy_output(
    name = "capture_clippy_output",
    build_setting_default = False,
    visibility = ["//visibility:public"],
)

# This setting may be used to enable builds without the standard library.
# Currently only no_std + alloc is supported, which can be enabled with setting the value to "alloc".
# In the future we could add support for additional modes, e.g "core", "alloc,collections".
string_flag(
    name = "no_std",
    build_setting_default = "off",
    values = [
        "alloc",
        "off",
    ],
    visibility = ["//visibility:public"],
)

# A hack target to allow as to only apply the no_std mode in target config.
no_std(
    name = "build_target_in_no_std",
)

# A config setting for setting conditional `cargo_features`, `deps`, based on the `:no_std` value.
config_setting(
    name = "is_no_std",
    flag_values = {
        ":build_target_in_no_std": "alloc",
    },
    visibility = ["//visibility:public"],
)
